package com.bw.rabbitmq;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

/**
 * @author Monte
 * @author 644527030@qq.com
 * @author 知识改变命运，代码改变世界！
 * @date 2024年07月29日    11:09
 * @PackageName:com.bw.rabbitmq
 * @ClassName: MyAckListener
 * @Description HomeController
 */

public class MyAckListener implements ChannelAwareMessageListener {

    /**
     * 还可指定以下处理方式，可参考api：
     //消息的标识，false只确认当前一个消息收到，true确认所有consumer获得的消息
     channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
     //ack返回false，并重新回到队列，api里面解释得很清楚
     channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
     //丢弃这条消息
     channel.basicNack(message.getMessageProperties().getDeliveryTag(), false,false);
     //拒绝消息
     channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
     */
    //通知服务器此消息已经被消费，可从队列删掉， 这样以后就不会重发，否则后续还会在发

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        try {
            System.out.println(message);


            // 模拟一个异常
            // int i = 10/0;

            // 从队列中删除
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        }catch (Exception e){
            // 失败，不从队列中删除，再次回到队列
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
        }

    }
}
